## This test checks debug info for the case when one compilation unit
## contains a definition of a type and another compilation unit
## contains a definition of the same type. When --garbage-collection
## is enabled the result should contain the original definition in CU1
## and the definition from CU2 should have been removed.

# RUN: yaml2obj %s -o %t.o

## Check --odr-deduplication.
# RUN: llvm-dwarfutil %t.o %t1
# RUN: llvm-dwarfdump -a %t1 | FileCheck %s --check-prefixes=CHECK,CHECK-ODR

## Check --odr alias.
# RUN: llvm-dwarfutil --odr %t.o %t2
# RUN: cmp %t1 %t2

## Check --no-odr alias.
# RUN: llvm-dwarfutil --no-odr %t.o %t3
# RUN: llvm-dwarfdump -a %t3 | FileCheck %s --check-prefixes=CHECK,CHECK-NOODR

## Check --no-odr-deduplication wins if last.
# RUN: llvm-dwarfutil --odr-deduplication --no-odr-deduplication %t.o %t4
# RUN: cmp %t3 %t4

## Check --odr-deduplication wins if last.
# RUN: llvm-dwarfutil --no-odr-deduplication --odr-deduplication %t.o %t6
# RUN: cmp %t1 %t6

## CU1:
##
## class class1 {
##   char member1;
##   float member2;
## };
##
## class1 *var1;
##
## CU2:
##
## class class1 {
##   char member1;
##   float member2;
## };
##
## class1 *var1;

# CHECK: file format elf64-x86-64
# CHECK: .debug_info contents:

# CHECK: DW_TAG_compile_unit
# CHECK: DW_AT_name{{.*}}"CU1"

# CHECK: 0x[[CU1_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
# CHECK: DW_TAG_member
# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_CHAR:[0-9a-f]*]] "char"
# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_CHAR:[0-9a-f]*]] "char"
# CHECK: DW_AT_name{{.*}}"member1"

# CHECK: DW_TAG_member
# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_FLOAT:[0-9a-f]*]] "float"
# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_FLOAT:[0-9a-f]*]] "float"
# CHECK: DW_AT_name{{.*}}"member2"

# CHECK: 0x[[CU1_INT:[0-9a-f]*]]: DW_TAG_base_type
# CHECK: DW_AT_name{{.*}}"int"

# CHECK: 0x[[CU1_CHAR]]: DW_TAG_base_type
# CHECK: DW_AT_name{{.*}}"char"

# CHECK: 0x[[CU1_FLOAT]]: DW_TAG_base_type
# CHECK: DW_AT_name{{.*}}"float"

# CHECK-ODR: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1"
# CHECK-NOODR: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CU1_CLASS1]] "class1"

# CHECK: DW_TAG_variable
# CHECK: DW_AT_name{{.*}}"var1"
# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS1]] "class1 *"
# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_PTR_CLASS1]] "class1 *"

# CHECK: DW_TAG_compile_unit
# CHECK: DW_AT_name{{.*}}"CU2"

# CHECK-ODR-NOT: DW_TAG_class_type
# CHECK-ODR-NOT: "class1"

# CHECK-ODR: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1"

# CHECK-ODR: DW_TAG_variable
# CHECK-ODR: DW_AT_name{{.*}}"var1"
# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS1]] "class1 *"


# CHECK-NOODR: 0x[[CU2_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
# CHECK-NOODR: DW_TAG_member
# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_CHAR:[0-9a-f]*]] "char"
# CHECK-NOODR: DW_AT_name{{.*}}"member1"

# CHECK-NOODR: DW_TAG_member
# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_FLOAT:[0-9a-f]*]] "float"
# CHECK-NOODR: DW_AT_name{{.*}}"member2"

# CHECK-NOODR: 0x[[CU2_INT:[0-9a-f]*]]: DW_TAG_base_type
# CHECK-NOODR: DW_AT_name{{.*}}"int"

# CHECK-NOODR: 0x[[CU2_CHAR]]: DW_TAG_base_type
# CHECK-NOODR: DW_AT_name{{.*}}"char"

# CHECK-NOODR: 0x[[CU2_FLOAT]]: DW_TAG_base_type
# CHECK-NOODR: DW_AT_name{{.*}}"float"

# CHECK-NOODR: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CU2_CLASS1]] "class1"

# CHECK-NOODR: DW_TAG_variable
# CHECK-NOODR: DW_AT_name{{.*}}"var1"
# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_PTR_CLASS1]] "class1 *"

--- !ELF
FileHeader:
  Class:    ELFCLASS64
  Data:     ELFDATA2LSB
  Type:     ET_REL
  Machine:  EM_X86_64
Sections:
  - Name:            .text
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1000
    Size:            0x1b
  - Name:            .text2
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x2000
    Size:            0x1b
DWARF:
  debug_abbrev:
    - Table:
      - Tag:      DW_TAG_compile_unit
        Children: DW_CHILDREN_yes
        Attributes:
          - Attribute: DW_AT_producer
            Form:      DW_FORM_string
          - Attribute: DW_AT_language
            Form:      DW_FORM_data2
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_low_pc
            Form:      DW_FORM_addr
          - Attribute: DW_AT_high_pc
            Form:      DW_FORM_data8
      - Tag:      DW_TAG_class_type
        Children: DW_CHILDREN_yes
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
      - Tag:      DW_TAG_member
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
      - Tag:      DW_TAG_class_type
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_declaration
            Form:      DW_FORM_flag_present
      - Tag:      DW_TAG_class_type
        Children: DW_CHILDREN_yes
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_declaration
            Form:      DW_FORM_flag_present
      - Tag:      DW_TAG_template_type_parameter
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
      - Tag:      DW_TAG_base_type
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
      - Tag:      DW_TAG_pointer_type
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
      - Tag:      DW_TAG_variable
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_const_value
            Form:      DW_FORM_data4
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
    - Table:
      - Tag:      DW_TAG_compile_unit
        Children: DW_CHILDREN_yes
        Attributes:
          - Attribute: DW_AT_producer
            Form:      DW_FORM_string
          - Attribute: DW_AT_language
            Form:      DW_FORM_data2
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_low_pc
            Form:      DW_FORM_addr
          - Attribute: DW_AT_high_pc
            Form:      DW_FORM_data8
      - Tag:      DW_TAG_class_type
        Children: DW_CHILDREN_yes
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
      - Tag:      DW_TAG_member
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
      - Tag:      DW_TAG_class_type
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_declaration
            Form:      DW_FORM_flag_present
      - Tag:      DW_TAG_class_type
        Children: DW_CHILDREN_yes
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_declaration
            Form:      DW_FORM_flag_present
      - Tag:      DW_TAG_template_type_parameter
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
      - Tag:      DW_TAG_base_type
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
      - Tag:      DW_TAG_pointer_type
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
      - Tag:      DW_TAG_variable
        Children: DW_CHILDREN_no
        Attributes:
          - Attribute: DW_AT_name
            Form:      DW_FORM_string
          - Attribute: DW_AT_const_value
            Form:      DW_FORM_data4
          - Attribute: DW_AT_type
            Form:      DW_FORM_ref4
  debug_info:
    - Version: 4
      Entries:
        - AbbrCode: 1
          Values:
            - CStr: by_hand
            - Value:  0x04
            - CStr: CU1
            - Value:  0x1000
            - Value:  0x1b
        - AbbrCode: 2
          Values:
            - CStr: class1
        - AbbrCode: 3
          Values:
            - Value:  0x00000052
            - CStr: member1
        - AbbrCode: 3
          Values:
            - Value:  0x00000058
            - CStr: member2
        - AbbrCode: 0
        - AbbrCode: 7
          Values:
            - CStr: int
        - AbbrCode: 7
          Values:
            - CStr: char
        - AbbrCode: 7
          Values:
            - CStr: float
        - AbbrCode: 8
          Values:
            - Value:  0x0000002a
        - AbbrCode: 9
          Values:
            - CStr: var1
            - Value:  0x00000000
            - Value:  0x0000005f
        - AbbrCode: 0
    - Version: 4
      Entries:
        - AbbrCode: 1
          Values:
            - CStr: by_hand
            - Value:  0x04
            - CStr: CU2
            - Value:  0x2000
            - Value:  0x1b
        - AbbrCode: 2
          Values:
            - CStr: class1
        - AbbrCode: 3
          Values:
            - Value:  0x00000052
            - CStr: member1
        - AbbrCode: 3
          Values:
            - Value:  0x00000058
            - CStr: member2
        - AbbrCode: 0
        - AbbrCode: 7
          Values:
            - CStr: int
        - AbbrCode: 7
          Values:
            - CStr: char
        - AbbrCode: 7
          Values:
            - CStr: float
        - AbbrCode: 8
          Values:
            - Value:  0x0000002a
        - AbbrCode: 9
          Values:
            - CStr: var1
            - Value:  0x00000000
            - Value:  0x0000005f
        - AbbrCode: 0
...
